170 lines
9.5 KiB
Python
170 lines
9.5 KiB
Python
|
|
import ast
|
|
import datetime
|
|
import json
|
|
import re
|
|
import uuid
|
|
import logging
|
|
import base64
|
|
import subprocess
|
|
import tempfile
|
|
import easywebdav
|
|
import os
|
|
import os.path
|
|
|
|
|
|
from odoo import api, fields, models, _
|
|
from odoo import tools
|
|
from odoo.exceptions import ValidationError
|
|
from datetime import date
|
|
from datetime import datetime
|
|
from dateutil.relativedelta import relativedelta
|
|
from pyffmpeg import FFmpeg
|
|
from tuya_iot import TuyaOpenAPI, TUYA_LOGGER
|
|
from tuya_connector import TuyaOpenAPI, TUYA_LOGGER
|
|
import sys
|
|
|
|
TUYA_LOGGER.setLevel(logging.DEBUG)
|
|
_logger = logging.getLogger(__name__)
|
|
|
|
|
|
class dssgeraetetypen(models.Model):
|
|
_name = "dss.geraetetypen"
|
|
_description = "DigitalSignage Geraetetypen"
|
|
_inherit = ['mail.thread','mail.activity.mixin']
|
|
_rec_name = "geraetename"
|
|
geraetename = fields.Char('Geraetename', required=True)
|
|
uuid = fields.Char(default=lambda self: self._default_uuid(), required=True, readonly=True, copy=False, string='UUID')
|
|
geraetetyp = fields.Selection([('SYS','Systemgerät'), ('STE','Steuergerät'), ('DIV','Anderes'), ('ANZ','Anzeigegerät'), ('PLY','Abspielgerät')],tracking=True)
|
|
# grundsystem = fields.Many2one('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True)
|
|
grundsystem = fields.Many2many('dss.systemtypen', string="Gerät ist nutzbar für",tracking=True)
|
|
grundsystem_kennung = fields.Char(string='Kennung', related='grundsystem.kennung',tracking=True)
|
|
|
|
standort = fields.Char('Hauptstandort des Gerätes',tracking=True)
|
|
|
|
farbe = fields.Char('Grundfarbe',tracking=True)
|
|
|
|
has_heizung = fields.Boolean('Mit Heizsystem',tracking=True)
|
|
has_klima = fields.Boolean('Mit Klimasystem',tracking=True)
|
|
has_fan = fields.Boolean('Mit Ventiltorensystem',tracking=True)
|
|
has_tuya = fields.Boolean('Mit Tuyasteuerung',tracking=True)
|
|
|
|
stromzaehler = fields.Many2one('dss.geraetetypen',tracking=True)
|
|
stromverbrauch_avg = fields.Integer('Stromverbrauch AVG in W',tracking=True)
|
|
|
|
osvorhanden = fields.Boolean('Mit Betriebssystem',tracking=True)
|
|
osname = fields.Char('Betriebssystem',tracking=True)
|
|
ostyp = fields.Selection([('Win','Windows'), ('Lin','Linux'), ('And','Android'),('Ras','Raspberry PI'),('Non','Keines bekannt'),('Div','Anderes')],tracking=True);
|
|
|
|
lcd_ausrichtung = fields.Selection([('quer','Horizontal/Querformat'), ('hoch','Vertikal/Hochformat'),('Divers','Andere Art')],'LCD Ausrichtung',tracking=True);
|
|
lcd_touch = fields.Boolean('Touchsystem',tracking=True)
|
|
lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung',tracking=True);
|
|
lcd_montage_sonstige = fields.Char('Sonstige Montageart',tracking=True)
|
|
lcd_size = fields.Selection([('42','42 Zoll'), ('55','55 Zoll'), ('65','65 Zoll'),('75','75 Zoll'),('10','10.x Zoll'),('00','Sonstige')],'LCD Größe',tracking=True);
|
|
lcd_size_sonstige = fields.Char('LCD Sondergröße',tracking=True)
|
|
|
|
led_geraetetyp = fields.Selection([('MOD','LED Modul'),('NET','Netzgerät'), ('REC','Receiving Karte'), ('STE','Steuerkarte'),('LFT','Lüftertyp')],tracking=True)
|
|
led_module_pixelpitch = fields.Float('Modulpixelpitch',tracking=True)
|
|
led_module_breite = fields.Integer('Modulbreite mm',tracking=True)
|
|
led_module_hoehe = fields.Integer('Modulhoehe mm',tracking=True)
|
|
led_module_pixel_breite = fields.Integer('Modulbreite px',tracking=True)
|
|
led_module_pixel_hoehe = fields.Integer('Modulhoehe px',tracking=True)
|
|
|
|
led_module_system = fields.Selection([('FIX1','Fix Verschraubt'), ('MAG1','Magnetisch haltend'), ('RIG1','Imbus Veriegelt (vorn)'),('SONS','Sonstige')],'Modul Montage/Befestigung',tracking=True);
|
|
led_module_system_sonstige = fields.Char('Modulbefestigung Sonstige',tracking=True)
|
|
led_module_kennung = fields.Char('Modulbezeichnung',tracking=True)
|
|
led_module_serial = fields.Char('Modulseriennummer',tracking=True)
|
|
led_module_vendor = fields.Many2one('res.partner','Modul Hersteller',tracking=True)
|
|
|
|
led_receivingcard_vendor = fields.Many2one('res.partner','Receivingcard Hersteller')
|
|
led_receivingcard_kennung = fields.Char('Receivingcardtyp')
|
|
|
|
led_netzteil_typ = fields.Selection([('SNT','Schaltnetzteil'), ('STN','Steckernetzteil'), ('HNT','Hutschienennetzteil'),('INT','Internes Netzteil')],'Netzteil Bauart',tracking=True);
|
|
led_netzteil_vendor = fields.Many2one('res.partner','Netzteil Hersteller',tracking=True)
|
|
led_netzteil_kennung = fields.Char('Netzteilkennung',tracking=True)
|
|
led_netzteil_spannung = fields.Char('Netzteil Spannung V',tracking=True)
|
|
led_netzteil_leistung = fields.Char('Netzteil Leistung W',tracking=True)
|
|
|
|
lcd_montage = fields.Selection([('WAN','Wandmontage'), ('FUS','Standfuss rollbar'), ('FI1','Boden verankert 1 Fuss'),('FI2','Boden verankert 2 Füsse'),('FIX','Bodenverankert Blockfuss'),('XXX','Sonstige')],'Montage/Befestigung',tracking=True);
|
|
lcd_montage_sonstige = fields.Char('Sonstige Montageart',tracking=True)
|
|
|
|
|
|
hw_anzeige = fields.Many2one('dss.geraetetypen',domain="[('geraetetyp','=','ANZ')]",tracking=True)
|
|
hw_steuerung = fields.Many2one('dss.geraetetypen',domain="['&',('geraetetyp','=','STE'),('grundsystem_kennung','=','LED')]",tracking=True)
|
|
hw_player = fields.Many2one('dss.geraetetypen',domain="[('geraetetyp','=','PLY')]",tracking=True)
|
|
hw_umwelt = fields.Many2one('dss.geraetetypen',domain="['|',('geraetetyp','=','SYS'),('geraetetyp','=','DIV')]",tracking=True)
|
|
|
|
zusatz_integrationen = fields.Many2one('dss.geraetetypen',tracking=True)
|
|
zusatz_zubehoer = fields.Char('Sonstiges Zubehör',tracking=True)
|
|
|
|
tuya_Geraete_uid = fields.Char('Tuya Geräte UID',tracking=True)
|
|
tuya_Geraete_id = fields.Char('Tuya Geräte ID', tracking=True)
|
|
|
|
tuya_can_switch = fields.Boolean('Tuya mit Schalter',tracking=True)
|
|
tuya_has_powervalue = fields.Boolean('Tuya mit Stromzähler',tracking=True)
|
|
|
|
tuya_last_totalpower = fields.Char('Stromzähler Gesamt',tracking=True,readonly=True)
|
|
tuya_last_lastpower = fields.Char('Stromzähler Aktuell',tracking=True,readonly=True)
|
|
tuya_last_switchstate = fields.Char('Schalter Aktuell ',tracking=True,readonly=True)
|
|
|
|
@api.model
|
|
def _default_uuid(self):
|
|
return str(uuid.uuid4())
|
|
|
|
@api.depends('grundsystem')
|
|
def _compute_grundsystem_kennung(self):
|
|
for syst in self:
|
|
if syst.grundsystem:
|
|
syst.grundsystem_kennung = syst.grundsystem.kennung
|
|
|
|
def get_value_from_tuyaresult(self,dataset,valuename):
|
|
result=''
|
|
_logger.info('Resultanfrage:' + str(dataset)+' Feld : '+str(valuename))
|
|
for singlepart in dataset:
|
|
if singlepart:
|
|
if (singlepart['code'] == valuename):
|
|
result = singlepart['value']
|
|
break
|
|
return result
|
|
|
|
def pyaction_tuya_readout(self):
|
|
_logger.info('Tuya Schaltanfrage : Endpoint - ' + str(dssSettings._get_settingvalue(self,'tuya_endpoint')) + ' AccessID ' + str(dssSettings._get_settingvalue(self,'tuya_access_id')) + ' AccessKEY ' + str(dssSettings._get_settingvalue(self,'tuya_access_key')))
|
|
openapi = TuyaOpenAPI(dssSettings._get_settingvalue(self,'tuya_endpoint'),dssSettings._get_settingvalue(self,'tuya_access_id'),dssSettings._get_settingvalue(self,'tuya_access_key'))
|
|
openapi.connect()
|
|
switchcode = eval('True')
|
|
commands = {'commands':[{'code':'switch','value': switchcode}]}
|
|
# result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands)
|
|
result = openapi.get('/v1.0/iot-03/devices/{}/status'.format(self.tuya_Geraete_id))
|
|
_logger.info('Erfolg ? :' + str(result['success']))
|
|
success = result['success']
|
|
if success:
|
|
_logger.info('Erfolgreiche Anfrage :' + str(result['result']))
|
|
if self.tuya_has_powervalue:
|
|
self.tuya_last_totalpower = self.get_value_from_tuyaresult(result['result'],'forward_energy_total')
|
|
self.tuya_last_lastpower = self.get_value_from_tuyaresult(result['result'],'phase_a')
|
|
if self.tuya_can_switch:
|
|
self.tuya_last_switchstate = self.get_value_from_tuyaresult(result['result'],'switch')
|
|
else:
|
|
_logger.info('Fehlerhafte Anfrage :' + str(result['msg']))
|
|
|
|
def pyaction_tuya_switch(self):
|
|
_logger.info('Tuya Schaltanfrage : Endpoint - ' + str(
|
|
dssSettings._get_settingvalue(self, 'tuya_endpoint')) + ' AccessID ' + str(
|
|
dssSettings._get_settingvalue(self, 'tuya_access_id')) + ' AccessKEY ' + str(
|
|
dssSettings._get_settingvalue(self, 'tuya_access_key')))
|
|
openapi = TuyaOpenAPI(dssSettings._get_settingvalue(self, 'tuya_endpoint'),
|
|
dssSettings._get_settingvalue(self, 'tuya_access_id'),
|
|
dssSettings._get_settingvalue(self, 'tuya_access_key'))
|
|
openapi.connect()
|
|
commands = {'commands': [{'code': 'switch', 'value': not self.tuya_last_switchstate}]}
|
|
# result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands)
|
|
result = openapi.post('/v1.0/iot-03/devices/{}/commands'.format(self.tuya_Geraete_id),commands)
|
|
_logger.info('Erfolg ? :' + str(result['success']))
|
|
success = result['success']
|
|
if success:
|
|
_logger.info('Erfolgreiche Anfrage :' + str(result['result']))
|
|
self.pyaction_tuya_readout()
|
|
else:
|
|
_logger.info('Fehlerhafte Anfrage :' + str(result['msg']))
|
|
|