Removed and restructured old unused snippets
This commit is contained in:
parent
1a3bcb88f0
commit
69465c8edf
19 changed files with 0 additions and 361 deletions
|
@ -1,27 +0,0 @@
|
||||||
import paho.mqtt.client as mqtt
|
|
||||||
|
|
||||||
|
|
||||||
# The callback for when the client receives a CONNACK response from the server.
|
|
||||||
def on_connect(client, userdata, flags, reason_code, properties):
|
|
||||||
print(f"Connected with result code {reason_code}")
|
|
||||||
# Subscribing in on_connect() means that if we lose the connection and
|
|
||||||
# reconnect then subscriptions will be renewed.
|
|
||||||
client.subscribe("zigbee2mqtt/#")
|
|
||||||
|
|
||||||
|
|
||||||
# The callback for when a PUBLISH message is received from the server.
|
|
||||||
def on_message(client, userdata, msg):
|
|
||||||
print(msg.topic + " " + str(msg.payload))
|
|
||||||
|
|
||||||
|
|
||||||
mqttc = mqtt.Client(mqtt.CallbackAPIVersion.VERSION2)
|
|
||||||
mqttc.on_connect = on_connect
|
|
||||||
mqttc.on_message = on_message
|
|
||||||
|
|
||||||
mqttc.connect("raspberrypi", 1883, 60)
|
|
||||||
|
|
||||||
# Blocking call that processes network traffic, dispatches callbacks and
|
|
||||||
# handles reconnecting.
|
|
||||||
# Other loop*() functions are available that give a threaded interface and a
|
|
||||||
# manual interface.
|
|
||||||
mqttc.loop_forever()
|
|
|
@ -1 +0,0 @@
|
||||||
paho-mqtt
|
|
|
@ -1,58 +0,0 @@
|
||||||
import asyncio
|
|
||||||
from fastapi.responses import HTMLResponse, JSONResponse
|
|
||||||
from fastapi import APIRouter
|
|
||||||
|
|
||||||
import os
|
|
||||||
import csv
|
|
||||||
from .handlers.bett import file_path, local_history, log_bed_weights
|
|
||||||
|
|
||||||
|
|
||||||
router = APIRouter()
|
|
||||||
asyncio.create_task(log_bed_weights())
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/file", tags=["file"])
|
|
||||||
async def get_file():
|
|
||||||
with open(file_path, "r", encoding="UTF-8") as fp:
|
|
||||||
return HTMLResponse("\n".join(fp.readlines()))
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/history")
|
|
||||||
async def get_history(count: int = None) -> list[dict]:
|
|
||||||
|
|
||||||
points = []
|
|
||||||
with open(file_path, "r", encoding="UTF-8") as fp:
|
|
||||||
reader = csv.DictReader(fp, delimiter=";")
|
|
||||||
for row in reader:
|
|
||||||
if not row:
|
|
||||||
continue
|
|
||||||
|
|
||||||
points.append(
|
|
||||||
{
|
|
||||||
"timestamp": row["timestamp"],
|
|
||||||
"total": float(row["total"]),
|
|
||||||
"tl": float(row["tl"]),
|
|
||||||
"tr": float(row["tr"]),
|
|
||||||
"bl": float(row["bl"]),
|
|
||||||
"br": float(row["br"]),
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
if count:
|
|
||||||
return points[-count]
|
|
||||||
else:
|
|
||||||
return points
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/latest")
|
|
||||||
async def get_latest():
|
|
||||||
if len(local_history) == 0:
|
|
||||||
return HTMLResponse(status_code=200, content="No data given yet")
|
|
||||||
return JSONResponse(local_history[-1])
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@router.delete("/delete", tags=["file"])
|
|
||||||
async def delete_file():
|
|
||||||
os.remove(file_path)
|
|
||||||
return "Deleted file"
|
|
|
@ -1,78 +0,0 @@
|
||||||
import asyncio
|
|
||||||
import logging
|
|
||||||
from fritzconnection import FritzConnection
|
|
||||||
from datetime import datetime
|
|
||||||
from ..hue import hue
|
|
||||||
|
|
||||||
|
|
||||||
refresh_every_seconds: int = 60 # Every x seconds devices are polled again
|
|
||||||
trigger_away_after_seconds: int = (
|
|
||||||
3 * 60
|
|
||||||
) # After all away-devices are gone for x seconds
|
|
||||||
away_triggered = False
|
|
||||||
away_devices = ["B2:06:77:EE:A9:0F"] # Max' iPhone
|
|
||||||
macaddresses_to_track = ["B2:06:77:EE:A9:0F"] # Max' iPhone
|
|
||||||
|
|
||||||
fritz_api = FritzConnection(address="192.168.178.1")
|
|
||||||
|
|
||||||
# Referenced documentation: https://avm.de/fileadmin/user_upload/Global/Service/Schnittstellen/hostsSCPD.pdf
|
|
||||||
|
|
||||||
|
|
||||||
devices_last_online = {}
|
|
||||||
|
|
||||||
|
|
||||||
def get_all_devices() -> list:
|
|
||||||
numberOfDevices = fritz_api.call_action("Hosts", "GetHostNumberOfEntries")[
|
|
||||||
"NewHostNumberOfEntries"
|
|
||||||
]
|
|
||||||
devices = []
|
|
||||||
for i in range(numberOfDevices):
|
|
||||||
devices.append(
|
|
||||||
fritz_api.call_action("Hosts", "GetGenericHostEntry", NewIndex=i)
|
|
||||||
)
|
|
||||||
return devices
|
|
||||||
|
|
||||||
|
|
||||||
def get_specific_device(mac_address: str) -> dict:
|
|
||||||
return fritz_api.call_action(
|
|
||||||
"Hosts", "GetSpecificHostEntry", NewMACAddress=mac_address
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
def check_for_change():
|
|
||||||
# Check if devices are away for away-mode
|
|
||||||
all_away = True
|
|
||||||
for device in away_devices:
|
|
||||||
last_online = devices_last_online[device]
|
|
||||||
if (datetime.now() - last_online).total_seconds() < trigger_away_after_seconds:
|
|
||||||
all_away = False
|
|
||||||
break
|
|
||||||
|
|
||||||
# Execute away mode
|
|
||||||
global away_triggered
|
|
||||||
if all_away:
|
|
||||||
if not away_triggered:
|
|
||||||
away_triggered = True
|
|
||||||
hue.in_room_deactivate_lights("Max Zimmer")
|
|
||||||
else:
|
|
||||||
away_triggered = False
|
|
||||||
|
|
||||||
async def track_network_devices():
|
|
||||||
global devices_last_online
|
|
||||||
|
|
||||||
# Initial values to avoid None
|
|
||||||
for macaddress in macaddresses_to_track:
|
|
||||||
devices_last_online[macaddress] = datetime(1970, 1, 1, 0, 0, 0)
|
|
||||||
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
for macaddress in macaddresses_to_track:
|
|
||||||
is_online = get_specific_device(macaddress)["NewActive"]
|
|
||||||
if is_online:
|
|
||||||
devices_last_online[macaddress] = datetime.now()
|
|
||||||
|
|
||||||
check_for_change()
|
|
||||||
except Exception as ex:
|
|
||||||
logging.exception(ex)
|
|
||||||
finally:
|
|
||||||
await asyncio.sleep(refresh_every_seconds)
|
|
|
@ -1,86 +0,0 @@
|
||||||
from time import sleep
|
|
||||||
from phue import Bridge
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
|
|
||||||
class HueAdapter:
|
|
||||||
"""Handler for Hue API calls."""
|
|
||||||
|
|
||||||
registered_ips_file = "hue_bridge_registered.txt"
|
|
||||||
|
|
||||||
def __init__(self, bridge_ip: str):
|
|
||||||
"""Initialize the HueHandler."""
|
|
||||||
self.bridge = None
|
|
||||||
self.connect(bridge_ip)
|
|
||||||
|
|
||||||
def connect(self, bridge_ip: str):
|
|
||||||
if bridge_ip in self.get_registered_ips():
|
|
||||||
self.bridge = Bridge(bridge_ip)
|
|
||||||
self.bridge.connect()
|
|
||||||
return
|
|
||||||
|
|
||||||
# Connect loop
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
self.bridge = Bridge(bridge_ip)
|
|
||||||
self.bridge.connect()
|
|
||||||
break
|
|
||||||
except Exception as e:
|
|
||||||
print(f"Failed to connect to bridge: {bridge_ip}")
|
|
||||||
print(e)
|
|
||||||
print("Trying again in 5 seconds..")
|
|
||||||
sleep(5)
|
|
||||||
|
|
||||||
self.register_bridge(bridge_ip)
|
|
||||||
|
|
||||||
def get_registered_ips(self) -> list:
|
|
||||||
"""Get a list of registered bridge IPs."""
|
|
||||||
if not Path(HueAdapter.registered_ips_file).is_file():
|
|
||||||
return []
|
|
||||||
|
|
||||||
with open(HueAdapter.registered_ips_file, "r") as f:
|
|
||||||
return [ad.strip() for ad in f.readlines()]
|
|
||||||
|
|
||||||
def register_bridge(self, bridge_ip: str):
|
|
||||||
"""Register a bridge IP."""
|
|
||||||
with open(HueAdapter.registered_ips_file, "a") as f:
|
|
||||||
f.write(bridge_ip + "\n")
|
|
||||||
|
|
||||||
def list_scenes(self) -> dict:
|
|
||||||
return self.bridge.get_scene()
|
|
||||||
|
|
||||||
def get_scene_by_name(self, name):
|
|
||||||
for key, scene in self.list_scenes().items():
|
|
||||||
if scene["name"] == name:
|
|
||||||
scene["id"] = key
|
|
||||||
return scene
|
|
||||||
return None
|
|
||||||
|
|
||||||
def in_room_activate_scene(self, room_name: str, scene_name: str):
|
|
||||||
"""Activate a scene in a room.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
scene (str): The name of the scene to activate.
|
|
||||||
room (str): The name of the room to activate the scene in.
|
|
||||||
"""
|
|
||||||
scene_id = self.get_scene_by_name(scene_name)["id"]
|
|
||||||
if scene_id is None:
|
|
||||||
raise "Scene not found."
|
|
||||||
|
|
||||||
self.bridge.set_group(room_name, {"scene": scene_id})
|
|
||||||
|
|
||||||
def in_room_deactivate_lights(self, room_name: str):
|
|
||||||
"""Deactivate all lights in a room.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
room_name (str): The name of the room to deactivate the lights in.
|
|
||||||
"""
|
|
||||||
self.bridge.set_group(room_name, {"on": False})
|
|
||||||
|
|
||||||
def in_room_activate_lights(self, room_name: str):
|
|
||||||
"""Activate all lights in a room.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
room_name (str): The name of the room to activate the lights in.
|
|
||||||
"""
|
|
||||||
self.bridge.set_group(room_name, {"on": True})
|
|
|
@ -1,60 +0,0 @@
|
||||||
from fastapi import FastAPI, APIRouter
|
|
||||||
|
|
||||||
from hue.hue_adapter import HueAdapter
|
|
||||||
from ..mash.core.feature import Feature
|
|
||||||
from fastapi import APIRouter
|
|
||||||
from fastapi.responses import HTMLResponse
|
|
||||||
|
|
||||||
router = APIRouter(tags=["hue"])
|
|
||||||
hue = HueAdapter("192.168.178.85")
|
|
||||||
|
|
||||||
########## Integration ##########
|
|
||||||
|
|
||||||
|
|
||||||
class HueIntegration(Feature):
|
|
||||||
def __init__(self) -> None:
|
|
||||||
super().__init__("hue")
|
|
||||||
|
|
||||||
def add_routes(self, server: FastAPI) -> None:
|
|
||||||
server.include_router(router, prefix="/hue")
|
|
||||||
|
|
||||||
|
|
||||||
########## Routes ##########
|
|
||||||
|
|
||||||
|
|
||||||
@router.get("/scenes", tags=["scene"])
|
|
||||||
async def get_scenes():
|
|
||||||
return hue.list_scenes()
|
|
||||||
|
|
||||||
|
|
||||||
@router.post(
|
|
||||||
"/room/{room_name}/scene/{scene_name}",
|
|
||||||
tags=["room", "scene"],
|
|
||||||
)
|
|
||||||
async def activate_scene(room_name: str, scene_name: str):
|
|
||||||
try:
|
|
||||||
hue.in_room_activate_scene(room_name, scene_name)
|
|
||||||
except Exception as e:
|
|
||||||
return HTMLResponse(status_code=400, content=str(e))
|
|
||||||
|
|
||||||
|
|
||||||
@router.post(
|
|
||||||
"/room/{room_name}/off",
|
|
||||||
tags=["room"],
|
|
||||||
)
|
|
||||||
async def deactivate_room(room_name: str):
|
|
||||||
try:
|
|
||||||
hue.in_room_deactivate_lights(room_name)
|
|
||||||
except Exception as e:
|
|
||||||
return HTMLResponse(status_code=400, content=str(e))
|
|
||||||
|
|
||||||
|
|
||||||
@router.post(
|
|
||||||
"/room/{room_name}/on",
|
|
||||||
tags=["room"],
|
|
||||||
)
|
|
||||||
async def activate_room(room_name: str):
|
|
||||||
try:
|
|
||||||
hue.in_room_activate_lights(room_name)
|
|
||||||
except Exception as e:
|
|
||||||
return HTMLResponse(status_code=400, content=str(e))
|
|
|
@ -1,28 +0,0 @@
|
||||||
from mash.bridges.fritzbox.fritzbox_bridge import FritzBoxBridge, FritzDeviceState
|
|
||||||
from time import sleep
|
|
||||||
import logging
|
|
||||||
|
|
||||||
# logging.getLogger().setLevel(logging.DEBUG)
|
|
||||||
|
|
||||||
|
|
||||||
bridge = FritzBoxBridge(id="fritzbox", ip="192.168.178.1", refresh_delay_sec=3)
|
|
||||||
|
|
||||||
|
|
||||||
def device_change(mac_address: str, device_state: FritzDeviceState) -> None:
|
|
||||||
print(
|
|
||||||
f"{device_state.host_name} - {'Connected' if device_state.active else 'Disconnected'}"
|
|
||||||
)
|
|
||||||
print(str(device_state))
|
|
||||||
|
|
||||||
|
|
||||||
bridge.subscribe_device(device_change, mac_address="FA:01:EC:90:50:49")
|
|
||||||
|
|
||||||
bridge.connect()
|
|
||||||
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
sleep(3)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
break
|
|
||||||
|
|
||||||
bridge.disconnect()
|
|
|
@ -1,23 +0,0 @@
|
||||||
from time import sleep
|
|
||||||
from mash.bridges.zigbee2mqtt.zigbee2mqtt_bridge import Z2mBridge
|
|
||||||
|
|
||||||
|
|
||||||
z2m = Z2mBridge(id="z2m", ip="192.168.178.115")
|
|
||||||
|
|
||||||
|
|
||||||
def wardrobe_cb(device_name: str, payload: dict) -> None:
|
|
||||||
print(f"{device_name} - {'closed' if payload['contact'] else 'open'}")
|
|
||||||
|
|
||||||
|
|
||||||
z2m.subscribe_device(wardrobe_cb, friendly_name="max-wardrobe-door")
|
|
||||||
z2m.subscribe_device(wardrobe_cb, friendly_name="max-window-contact")
|
|
||||||
|
|
||||||
z2m.connect()
|
|
||||||
|
|
||||||
while True:
|
|
||||||
try:
|
|
||||||
sleep(3)
|
|
||||||
except KeyboardInterrupt:
|
|
||||||
break
|
|
||||||
|
|
||||||
z2m.disconnect()
|
|
Loading…
Reference in a new issue